//
//  LSStatusListViewModel.swift
//  MicroBlog
//
//  Created by lj on 15/9/9.
//  Copyright © 2015年 itcast. All rights reserved.
//

import UIKit
import ReactiveCocoa
import SDWebImage

class LSStatusListViewModel: NSObject {
    
    /// 微博数据数组
    lazy var statuses: [LSStatusViewModel] = [LSStatusViewModel]()
    
    /// 加载微博数据
    func loadStatuses() ->RACSignal {
        
        return RACSignal.createSignal({ (subscriber) -> RACDisposable! in
            
            NetworkTools.sharedNetworkTools.loadStatus().subscribeNext({ (result) -> Void in
                
                //获取result中的字典数组
                guard let array = result["statuses"] as? [[String: AnyObject]] else{
                    printLog("没有正确的数据")
                    return
                }

                //字典转模型
                
                var arrayM = [LSStatusViewModel]()
                //遍历数组
                for dict in array {
                    arrayM.append(LSStatusViewModel(status: LSStatus(dict: dict)))
                    
                }
                
                // 添加尾随闭包
                self.cacheWebImage(arrayM) {
                    
                    self.statuses += arrayM
                    
                    // 3. 通知调用方数据加载完成
                    subscriber.sendCompleted()
                }
                }, error: { (error) -> Void in
                    
                    subscriber.sendError(error)
                    
                }) {}
 
            return nil
        })
    }
    
    /// 缓存网络图片
    ///
    /// - parameter array:    视图模型数组
    /// - parameter finished: 完成回调
    private func cacheWebImage(array: [LSStatusViewModel], finished: () -> ()) {
        
        // 1. 定义调度组
        let group = dispatch_group_create()
        // 记录图像大小
        var dataLength = 0
        
        // 遍历视图模型数组
        for viewModel in array {
            
            // 目标：只需要缓存单张图片
            let count = viewModel.thumbnailURLs?.count ?? 0
            
            if count != 1 {
                continue
            }
            
//            printLog(viewModel.thumbnailURLs)
            
            // 2. 入组 - 紧贴着 block/闭包，enter & leave 要配对出现
            dispatch_group_enter(group)
            
            // 使用 SDWebImage 的核心函数下载图片
            SDWebImageManager.sharedManager().downloadImageWithURL(viewModel.thumbnailURLs![0], options: [], progress: nil, completed: { (image, _, _, _, _) in
                
                // 代码执行到此，图片已经缓存完成，不一定有 image
                if image != nil {
                    // 将 image 转换成二进制数据
                    let data = UIImagePNGRepresentation(image)
                    
                    dataLength += data?.length ?? 0
                }
                
                // 3. 出组 - block 的最后一句
                dispatch_group_leave(group)
            })
        }
        
        // 4. 调度组监听
        dispatch_group_notify(group, dispatch_get_main_queue()) {
            printLog("缓存图像完成 \(dataLength / 1024) K")
            
            // 执行闭包
            finished()
        }
    }
    
}
